package it.gnocco.robotica;

import java.awt.Color;
import java.util.ArrayList;

import it.gnocco.grafo.Nodo;
import it.gnocco.log.Logger;


public class Robot {
	private static final String CLASS = "Robot";
	private int _id = 1;
	private Nodo posizione = null;
	public Color colore = Color.cyan;
	public ArrayList<Nodo> visibili = new ArrayList<Nodo>();
	private String color = "ciano";
	public Robot(int id){
		_id = id;
		if (id==0){
			colore = Color.red;
			color = "rosso";
		} else if (id==1){
			colore = Color.blue;
			color = "blu";
		} else if (id==2){
			colore = Color.magenta;
			color = "magenta";
		} else if (id==4){
			colore = Color.orange;
			color = "arancione";
		} else if (id==3){
			colore = Color.pink;
			color = "rosa";
		}
	}
	
	public void setPosizione(Nodo n){
		n.addRobot(this);
		visibili = new ArrayList<Nodo>();
		visibili.add(n);
		for(int i = 0; i < n.sizeVicini(); i++){
			if(!visibili.contains(n.getNodo(i)))
				visibili.add(n.getNodo(i));
		}
		posizione = n;
	}

	public Nodo getPosizione(){
		return posizione;
	}

	public int getId(){
		return _id;
	}

	public void avaria(int tipo){
		String METHOD = "avaria";
		if (tipo==1){
			Logger.log(Logger.INFO, CLASS, METHOD, "Il " + this.toString() + " ha subito un avaria e perde una direzione casuale");
			visibili.remove((int)(Math.random()*(visibili.size()-1))+1);
		} else if (tipo==2){
			Logger.log(Logger.WARNING, CLASS, METHOD, "Il " + this.toString() + " ha subito un avaria e ha solo una direzione casuale");
			Nodo n = visibili.get((int)(Math.random()*(visibili.size()-1))+1);
			visibili = new ArrayList<Nodo>();
			visibili.add(getPosizione());
			visibili.add(n);
		} else if (tipo==3){
			Logger.log(Logger.ERROR, CLASS, METHOD, "Il " + this.toString() + " ha subito un avaria e si ferma!");
			visibili = new ArrayList<Nodo>();
			visibili.add(getPosizione());
		}
	}

	public void avaria(int tipo, int direzione){
		String METHOD = "avaria";
		if(direzione<1)
			direzione=1;
		if(direzione> visibili.size())
			direzione = visibili.size();
		if (tipo==1){
			Logger.log(Logger.INFO, CLASS, METHOD, "Il " + this.toString() + " ha subito un avaria e perde la direzione "+direzione+"-esima");
			visibili.remove(direzione);
		} else if (tipo==2){
			Logger.log(Logger.WARNING, CLASS, METHOD, "Il " + this.toString() + " ha subito un avaria e ha solo la direzione "+direzione+"-esima");
			Nodo n = visibili.get(direzione);
			visibili = new ArrayList<Nodo>();
			visibili.add(getPosizione());
			visibili.add(n);
		} else if (tipo==3){
			avaria(tipo);
		}
	}

	
	public String toString(){
		return "robot n."+_id+" colore = "+color;
	}
	
	public boolean equals(Robot r){
		if(r.getId() == this.getId())
			return true;
		return false;
	}
	
	public int hashCode(){
		return this.getId();
	}

}
